package com.bestdata.TD440.datareceivefornetty;

import com.bestdata.TD440.datahandle.model.Queue;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import static com.bestdata.TD440.datahandle.model.Queue.dataQueue;

/**
 * @author
 */

@Component
public class DataReceiveServiceHandler extends ChannelInboundHandlerAdapter {

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    /**
     * channelAction
     *
     * channel 通道 action 活跃的
     *
     * 当客户端主动链接服务端的链接后，这个通道就是活跃的了。也就是客户端与服务端建立了通信通道并且可以传输数据
     *
     */
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        System.out.println(ctx.channel().localAddress().toString() + " 通道已激活！");
    }

    /**
     * channelInactive
     *
     * channel 通道 Inactive 不活跃的
     *
     * 当客户端主动断开服务端的链接后，这个通道就是不活跃的。也就是说客户端与服务端的关闭了通信通道并且不可以传输数据
     *
     */
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        System.out.println(ctx.channel().localAddress().toString() + " 通道不活跃！");
        // 关闭流

    }

    /**
     * 功能：读取客户端发送过来的信息
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {

        String cmd = msg.toString().substring(10,12);

        if("0E".equals(cmd)){
            //上传波形图数据
            //todo 振动设备ID是否需要转为字母+数字组合？...个人意见不需要转换，直接在配置文件中写好设备ID的16进制ASCII码，结果相同，但是少了一次转换过程，减少消耗！如需转换 代码在下文
            //添加待处理报文到指定队列等待处理

            dataQueue.put(msg.toString());

            if(dataQueue.size() > 900){
                logger.warn("warning!!!  dataQueue Length will full = {}!!!!",dataQueue.size());
            }

        } else if("00".equals(cmd)){

            //登录认证需要发送十六进制byte数组
            byte[] bytes = new byte[]{0x55, (byte) 0xAA,0x00,0x1A,0x02, (byte) 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
            //登录认证应答
            ctx.writeAndFlush(Unpooled.buffer().writeBytes(bytes));
            //写一个空的buf，并刷新写出区域。
            //ctx.writeAndFlush(Unpooled.EMPTY_BUFFER).addListener(ChannelFutureListener.CLOSE);
        }
    }

    /**
     * 功能：读取完毕客户端发送过来的数据之后的操作
     */
    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
    }

    /**
     * 功能：服务端发生异常的操作
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        ctx.close();
        System.out.println("异常信息：\r\n" + cause.getMessage());
    }

}
